/*
 *Manuel Zumbado Corrales   
 * Este programa permite recibir ciertos comandos desde serial para ingresar usuarios a un archivo 'UsuariosDB.txt'.
 */

#include <SD.h>


const int chipSelect = 4;                                     //Pin que corresponde al uso del almacenamiento SD.
char comandoSerialRecibido[50];                               //Variable global que contiene el comando recibido por Serial.
int posicionString=-1;                                        //Contador de posicion para el mensaje recibido
char usuariosActuales[100];                                   //Variable global donde se cargan los usuarios atuales almacenados en la tarjeta SD

void setup()
{
  Serial.begin(9600);                                        //Se inicializa el puerto serial.
  Serial.print("Initializing SD card...");
  pinMode(10, OUTPUT);                                       //Requisito para el funcionamiento del almacenamiento sd.



  if (!SD.begin(chipSelect)) {                              //Verifica que el dispositivo de almacenamiento este listo.
    Serial.println("Card failed, or not present");
    return;
  }
  
  Serial.println("card initialized.");
  File dataFile = SD.open("USUARI~1.TXT");                 //Se abre el archivo de texto


  if (dataFile) {                                         //Si el archivo existe, se cargan los nombres de los ususarios
    char caracter;
    boolean esNombre=true;
    int posicion=0;
    while (dataFile.available()) {
      caracter=dataFile.read();
      if(caracter==','&& esNombre){
        usuariosActuales[posicion]=caracter;
        esNombre=false ;
        posicion++;
      }
      if(esNombre){
        usuariosActuales[posicion]=caracter;
        posicion++;
      }
      if (caracter=='\n')
      {
        esNombre=true;
      }
    }
    usuariosActuales[posicion-1]='\0';                    //Se termina el Char Array.
    Serial.println(usuariosActuales); 
    dataFile.close();                                     //Se cierra el archivo.
  }  
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  } 
}

void loop()
{
  if(Serial.available() > 0){                           //Si existen datos por leer llama el metodo encargado de leerlos.
    leeDatosSerie();
  }
}







void leeDatosSerie(){

  while (Serial.available() > 0){                      //Mientras existan datos por leer
    Serial.println("Leyendo"); // debug

    int byteEntrada = Serial.read();                   //Se lee el siguiente byte
    posicionString++;
    if(byteEntrada=='\n'){                            //Si no hay mas por leer
      comandoSerialRecibido[posicionString] = 0;      //Se termina el Char Array
      Serial.println("ha terminado de leer");
      interpretarComando();                           //Se llama al metodo encargado de interpretar los comandos
      posicionString=-1;

    }
    else{                                             //Si no es el final del mensaje, se agrega el byte recibido al Array
      comandoSerialRecibido[posicionString] = byteEntrada; 

    }

  }
}


//Metodo encargado de interpretar los comandos recibidos
void interpretarComando(){

  int posicion=0;                                    //Se establecen 2 variables, una lleva el conteo de la posicion del Array y otra que almacena el nombre de usuario
  char usuario[50];

  while(comandoSerialRecibido[posicion]!=','){
    usuario[posicion]=comandoSerialRecibido[posicion];
    posicion++;
  }
  usuario[posicion]='\0';
  if(!verificaUsuario(usuario)){                   //Si el usuario es nuevo, se inserta en el archivo de texto
    File dataFile = SD.open("USUARI~1.TXT", FILE_WRITE);
    if (dataFile) {
      Serial.print("ingresando: ");
      Serial.println(comandoSerialRecibido);

      dataFile.println(comandoSerialRecibido);
      dataFile.close();
    }
    Serial.print("Ingresado,1,0");
  }
  else{
    Serial.print("Ingresado,0,1");
  }
}

boolean verificaUsuario(String usuario){        //Metodo encargado de verificar si un usuario ya esta registrado
  int contador=0;
  String a= String(usuariosActuales);
  Serial.println(a);
  if(a.indexOf(usuario) >=0){

    Serial.print(usuario);
    Serial.println(" existe");
    return true;

  } 
  else{
    Serial.print(usuario);
    Serial.println(" es nuevo");
    return false;
  }
}





